/*
 * wk_vector.h
 *
 *  Created on: 2012-3-8
 *      Author: tianmax
 *
 * Vector 类可以实现可增长的对象数组。与数组一样，它包含可以使用整数索引进行访问的组件。
 * 但是，Vector 的大小可以根据需要增大或缩小，以适应创建 Vector 后进行添加或移除项的操作。
 * 每个向量会试图通过维护 capacity 和 capacityIncrement 来优化存储管理。
 * capacity 始终至少应与向量的大小相等；
 * 这个值通常比后者大些，因为随着将组件添加到向量中，其存储将按 capacityIncrement 的大小增加存储块。
 * 应用程序可以在插入大量组件前增加向量的容量；这样就减少了增加的重分配的量。
 */

#ifndef __WK_VECTOR_H__
#define __WK_VECTOR_H__

#include "wk_vector_types.h"

/************************************************/

/**
 *
 * @param initsize:初始化大小
 * @param incrementsize:当向量溢出时增加的量
 */
extern WVector* wk_vector_init(wsize_t initsize,wsize_t incrementsize,wk_element_comp comp);
extern void wk_vector_destroy(WVector* vector);
/************************************************/
/*设置比较器*/
extern int wk_vector_setComp(WVector* vector,wk_element_comp comp);
/************************************************/
extern int wk_vector_initsize(WVector* vector);
extern int wk_vector_incrementsize(WVector* vector);
extern int wk_vector_size(WVector* vector);
extern int wk_vector_count(WVector* vector);
/**************************************************/
extern int wk_vector_sort(WVector* vector,wk_element_comp comp);
/*************************************************/
/**
 * 负责处理下标
 */
extern int wk_vector_index(WVector* vector,int index);

/**
 * 清除链表中的所有内容，使其成为一个空链表
 */
extern int wk_vector_clean(WVector* vector);
/**
 * 返回当前的容量
 */
extern int wk_vector_capacity(WVector* vector);

/**
 * 增加vector的容量
 */
extern int wk_vector_encapacity(WVector* vector,int addsize);

/**
 * 使容量和元素数量一样大
 */
extern int wk_vector_trim2count(WVector* vector);

/**
 * 使vector具有指定大小的容量
 */
extern int wk_vector_resize(WVector* vector,wsize_t newsize);

/**
 * 是否包含某元素
 */
extern int wk_vector_contains(WVector* vector,WPElement data/*,wk_vector_comp comp*/);

/**
 * 获取元素的下标
 */
extern int wk_vector_indexof(WVector* vector,WPElement data/*,wk_vector_comp comp*/);
extern int wk_vector_lastindexof(WVector* vector,WPElement data/*,wk_vector_comp comp*/);

/**
 * 是否为空
 */
extern int wk_vector_isempty(WVector* vector);

/**
 * 是否满
 */
extern int wk_vector_isfull(WVector* vector);
/*********************************/
extern int wk_vector_insert(WVector* vector,int index,WPElement data);
extern int wk_vector_insert_current(WVector* vector,WPElement data);
/********************************/
extern int wk_vector_append(WVector* vector,WPElement data);
/*******************************/
extern int wk_vector_remove(WVector* vector,int index);
extern int wk_vector_removeFirst(WVector* vector);
extern int wk_vector_removeLast(WVector* vector);
/********************************/
extern WPElement wk_vector_value(WVector* vector,int index);
extern WPElement wk_vector_find(WVector* vector,WPElement data,
		wk_vector_iterator iterator,wk_element_iterate_do iterate_do);
/********************************/
/**
 * 获取当前链表指针指向位置的元素的值
 */
extern WPElement wk_vector_getcurrent(WVector* vector);
/********************************/
extern int wk_vector_replace(WVector* vector,int index,WPElement data);
/******************************/
extern int wk_vector_push_front(WVector* vector,WPElement data);
extern int wk_vector_push_back(WVector* vector,WPElement data);
/******************************/
extern void wk_vector_pop_front(WVector* vector);
extern void wk_vector_pop_back(WVector* vector);
/**************************************/
/**
 * 链表当前指针操作
 */
extern void wk_vector_head(WVector* vector);
extern void wk_vector_begin(WVector* vector);
extern void wk_vector_end(WVector* vector);
extern void wk_vector_at(WVector* vector,int index);
extern void wk_vector_next(WVector* vector);
extern void wk_vector_prev(WVector* vector);
extern int wk_vector_hasNext(WVector* vector);
/*******************************/
/**
 * 遍历元素相关
 * ctx上下文
 */
extern void* wk_vector_iterate(WVector* vector,wk_element_iterate_do iterate_do,void* ctx);
/****************************************************/
/**
 * wk_slist调试函数
 */
extern void wk_vector_debug();
/*****************************************************/


#endif /* WK_VECTOR_H_ */
